474. 一和零

Title

Similar Question

Solution Tips

方案一: 01 背包

var findMaxForm = function(strs, m, n) {
    // 感觉总算是遇到一道标准一点的背包问题了
    // 相当于是有两个重量维度, 一个是 m, 一个是 n
    // 能装最多的元素的个数是多少
    const len = strs.length;
    // 处理出 weightM 和 weightN
    const weightM = Array.from({ length: len });
    const weightN = Array.from({ length: len });
    for (let i = 0; i < len; i++) {
        const str = strs[i];
        let m = 0;
        let n = 0;
        for (let j = 0; j < str.length; j++) {
            str[j] === '0' ? m++ : n++
        }
        weightM[i] = m;
        weightN[i] = n;
    }

    // 套用背包模板
    // dp[j][k] 表示 0 的个数为 j 个, 1 的个数为 k 个数, 能放入的长度
    // m 和 n 都 + 1 是为了表明最大重量可以刚好是 m 和 n
    const dp = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0));
    for (let i = 0; i < len; i++) {
        for (let j = m; j >= weightM[i]; j--) {
            for (let k = n; k >= weightN[i]; k--) {
                dp[j][k] = Math.max(dp[j][k], dp[j - weightM[i]][k - weightN[i]] + 1);
            }
        }
        // console.log(dp.concat()) //调试
    }

    return dp[m][n];
};

let strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
console.log(findMaxForm(strs, m, n));